/*
 * CopyRight(C) Kenbin
 */

#ifndef LWS_CBASICSEG_INCLUDED
#define LWS_CBASICSEG_INCLUDED

#include "lws_triedict.h"
#include "lws_wordgraph.h"
#include <vector>

using namespace std;

/*Comment#
   整个分词可以分为三个阶段:
   1、词语粗切分
   2、切分排岐与未登录词识别
   3、词性标注

   字串粗分又可以分为三个步骤:
   *1、原子切分
   *2、找出原子之间所有可能的组词方案(全切分)
   3、N-最短路径求解

   比如,"我是啃饼"经过原子切分变为:我/是/啃/饼;全切分之后的结果为:我/是/啃/啃饼/饼
   原子切分对应的位置序列为:0 1 2 3 4
   全切分对应的位置序列为:(0,1),(1,2),(2,3),(2,4),(3,4)
   把原子切分结果加入词图:(0,0),(1,1),(2,2),(3,3)
   把全切分结果加入词图:(0,1),(1,2),(2,3),(2,4),(3,4)
*/

namespace LWS {

    class CBasicSeg
    {
	public:
	    CBasicSeg(CTrieDict *trie_dict);
	    void Segment(char *text, CWordGraph *word_graph, bool is_atom_recog);

	    vector<const char *>& AtomPtrs() { return m_atom_ptrs; }
	    vector<int>& AtomTags() { return m_atom_tags; }
	    vector<int>& AtomTrieIdxs() { return m_atom_trieidxs; }

	private:
	    void recog_atom_segment(char *text);
	    void simple_atom_segment(char *text);

	    CTrieDict *m_trie_dict;

	    vector<const char *> m_atom_ptrs;
	    vector<int> m_atom_tags; /* 0:filter, 1:ok */
	    vector<int> m_atom_trieidxs;
    };
};

#endif
